Playing
Waveform-Audio Files
It s easy to
play sounds in your application by using the functions, macros, and messages
discussed in this overview. The techniques and elements documented here operate
only on waveform audio; that is, digitized representations of a sound s
physical shape. If you want to add music to your application, and you do not
care about other kinds of sounds, you might want to use MIDI. For a discussion
of a simple playback MIDI implementation, see the MCIWnd Window Class
You can use
the following functions to play waveform audio in your application in a single
function call:
Function |
Description |
MessageBeep |
Plays the
sound that corresponds to a specified system-alert level. |
sndPlaySound |
Plays the
sound that corresponds to the system sound entered in the registry or the
contents of the specified filename. |
PlaySound |
Provides
all the functionality of sndPlaySound |
The MessageBeep
function is a standard part of the Win32 API; because its capabilities are very
limited and it is documented elsewhere, it is not discussed here.
The functions
listed provide the following methods of playing waveform audio:
Playing waveform-audio files
associated with system-alert levels
Playing waveform-audio files
specified by entries in the registry
Playing in-memory WAVE
resources
Playing waveform-audio files
stored on a hard disk or compact disc - read-only memory (CD-ROM)
The sndPlaySound and PlaySound functions load an entire
waveform-audio file into memory and, in effect, limit the size of file they can
play. Use sndPlaySound and PlaySound to play waveform-audio files
that are relatively small up
to about 100K. These two functions also require the sound data to be in a
format that is playable by one of the installed waveform-audio drivers,
including the wave mapper.
For larger
sound files, use the Media Control Interface (MCI) services. For more
information, see MCI
Using Window Messages to Manage Waveform-Audio Playback
The following
messages can be sent to a window procedure function for managing waveform-audio
playback.
Message |
Description |
MM_WOM_CLOSE |
Sent when
the device is closed by using the waveOutClose |
MM_WOM_DONE |
Sent when
the device driver is finished with a data block sent by using the waveOutWrite |
MM_WOM_OPEN |
Sent when
the device is opened by using the waveOutOpen |
A wParam
and lParam parameter is associated with each of these messages. The wParam
parameter always specifies a handle of the open waveform-audio device. For the MM_WOM_DONE
The most
useful message is probably MM_WOM_DONE. When this message signals that playback
of a data block is complete, you can clean up and free the data block. Unless
you need to allocate memory or initialize variables, you probably do not need
to process the MM_WOM_OPEN and MM_WOM_CLOSE messages.
The callback
function for waveform-audio output devices is supplied by the application. For
information about this callback function, see the waveOutProc
Retrieving the Current Playback Position
You can
monitor the current playback position within the file while waveform audio is
playing by using the waveOutGetPosition
For
waveform-audio devices, samples are the preferred time format in which to
represent the current position. Thus, the current position of a waveform-audio
device is specified as the number of samples for one channel from the beginning
of the waveform-audio file. To query the current position of a waveform-audio
device, set the wType member of the MMTIME
The MMTIME
structure can represent time in one or more different formats, including
milliseconds, samples, SMPTE (Society of Motion Picture and Television
Engineers), and MIDI song pointer formats. The wType member specifies
the format used to represent time. Before calling a function that uses the MMTIME
structure, you must set wType to indicate your requested time format. Be
sure to check wType after the call to see whether the requested time
format is supported. If the requested time format is not supported, the device
driver specifies the time in an alternate time format and changes the wType
member to the selected time format.
For more
information about the MMTIME structure, see Multimedia Timers
Stopping, Pausing, and Restarting Playback
You can stop
or pause playback while waveform audio is playing. After playback has been
paused, you can restart it. Windows provides the following functions for
controlling waveform-audio playback.
Function |
Description |
waveOutPause |
Pauses
playback on a waveform-audio output device. |
waveOutReset |
Stops
playback on a waveform-audio output device and marks all pending data blocks
as done. |
WaveOutRestart |
Resumes
playback on a paused waveform-audio output device. |
Pausing a
waveform-audio device by using waveOutPause
Generally, as
soon as the first waveform-audio data block is sent by using the waveOutWrite
You cannot
use waveOutRestart to restart a device that has been stopped with waveOutReset
Looping Playback
Looping a
sound is controlled by the dwLoops and dwFlags members in the WAVEHDR
To loop a
single data block, specify both flags for the same block. To specify the number
of loops, use the dwLoops member in the WAVEHDR structure for the
first block in the loop.
You can call
the waveOutBreakLoop
Changing the Volume of Waveform-Audio Playback
Windows
provides the following functions to query and set the volume level of
waveform-audio output devices.
Function |
Description |
waveOutGetVolume |
Retrieves
the current volume level of the specified waveform-audio output device. |
waveOutSetVolume |
Sets the
volume level of the specified waveform-audio output device. |
Not all
waveform-audio devices support volume changes. Some devices support individual
volume control on both the left and right channels. For information about how
to determine the volume-control capabilities of waveform-audio devices, see Devices
and Data Types
Some
applications allow the user to control the volume for all audio devices in a
system. (Many applications of this type use the audio mixer services; for more
information, see Audio Mixers
Volume is
specified in a doubleword value. When the audio format is stereo, the upper 16
bits specify the relative volume of the right channel and the lower 16 bits
specify the relative volume of the left channel. For devices that do not
support left- and right-channel volume control, the lower 16 bits specify the
volume level, and the upper 16 bits are ignored.
Volume-level
values range from 0x0 (silence) to 0xFFFF (maximum volume) and are interpreted
logarithmically. The perceived volume increase is the same when increasing the
volume level from 0x5000 to 0x6000 as it is from 0x4000 to 0x5000.
Changing Pitch and Playback Rate
Some
waveform-audio output devices can vary the pitch and the playback rate of
waveform-audio data. Not all waveform-audio devices support pitch and
playback-rate changes. For information about how to determine whether a
particular waveform-audio device supports pitch and playback rate changes, see Devices
and Data Types
The
differences between changing pitch and playback rate are as follows:
Changing the playback rate is
performed by the device driver and does not require specialized hardware. The
sample rate is not changed, but the driver interpolates by skipping or
synthesizing samples. For example, if the playback rate is changed by a factor
of two, the driver skips every other sample.
Changing the pitch requires
specialized hardware. The playback rate and sample rate are not changed.
Windows
provides the following functions to query and set waveform-audio pitch and
playback rates.
Function |
Description |
waveOutGetPitch |
Retrieves
the pitch for the specified waveform-audio output device. |
waveOutGetPlaybackRate |
Retrieves
the playback rate for the specified waveform-audio output device. |
waveOutSetPitch |
Sets the
pitch for the specified waveform-audio output device. |
waveOutSetPlaybackRate |
Sets the
playback rate for the specified waveform-audio output device. |
The pitch and
playback rates are changed by a factor specified with a fixed-point number
packed into a doubleword value. The upper 16 bits specify the integer part of
the number; the lower 16 bits specify the fractional part. For example, the value
1.5 is represented as 0x00018000L. The value 0.75 is represented as
0x0000C000L. A value of 1.0 (0x00010000) means the pitch or playback rate is
unchanged.